Created: 2024-05-03 ven 10:39
https://www.youtube.com/watch?v=zkd6CLfNNe8
Partiamo con due punti che stanno uno sopra e l'altro sotto l'asse delle x della nostra funzione
A ogni iterazione calcoliamo il punto medio dell'intervallo: la nostra soluzione si trovera' sicuramente o a destra o a sinistra del punto medio
La parte giusta e' quella in cui le immagini dei due estremi dell'intervallo continuano ad essere uno sopra e l'altro sotto l'asse delle x.
import matplotlib.pyplot as plt
def f(x):
return pow(x,4) - 4*pow(x,2)
l = 1
r = 8
n = 1000
step = (r-l)/n
x = [l + i*step for i in range(n)]
y = [f(xi) for xi in x]
zeri = [0 for xi in x]
plt.plot(x,y)
plt.plot(x,zeri)
m = (l+r)/2
target = f(m)
i = 0
while target != 0:
if(i == 5):
break
if(target * f(l)) < 0:
r = m
else:
l = m
m = (l+r)/2
target=f(m)
i+=1
plt.plot(m,0,'ro')
plt.show()
Si parte da un punto arbitrario sull'asse delle \(x\).
"Approssimiamo" la funzione in quel punto con una retta, in particolare con la retta che passa per il punto \(f(x)\) e ha pendenza pari a \(f'(x)\).
Il prossimo punto della successione e' il punto in cui la retta interseca l'asse delle \(x\).
I valori della successione \({x_0, x_1, x_2, ...x_k}\) si avvicinano sempre di piu' alla vera radice della funzione.
import matplotlib.pyplot as plt
def f(x):
return pow(x,4) - 4*pow(x,2)
def der(x):
return (4*pow(x,3)) - (8*x)
xcurrent = -1.5
precision = 10e-5
while True:
xnext = xcurrent - (f(xcurrent)/der(xcurrent))
if(abs(f(xnext)) < precision):
break
xcurrent = xnext
# disegnamo la funzione
n = 10000
start = -2.1
end = 2.1
n = 10000
step = (end - start) / n
x_axis =[start+i*step for i in range(n)]
y_axis = [f(x) for x in x_axis]
zero = [0 for i in range(len(x_axis))]
# plot della funzione
plt.plot(x_axis, y_axis)
# plot dell'asse x
plt.plot(x_axis, zero)
# plot del punto trovato
plt.plot(xcurrent, f(xcurrent), '-ro')
plt.show()